package com.gitee.wsl.transform.encode.sample

import com.gitee.wsl.ext.string.splitBySpace
import com.gitee.wsl.transform.encode.DecodeToString
import com.gitee.wsl.transform.encode.StringEncode
import com.gitee.wsl.transform.encode.StringToStringEncodeDecode

object ElementPeriodicEncode:StringToStringEncodeDecode{

    val PERIOD_LIST =
        listOf(
            "H",
            "He",
            "Li",
            "Be",
            "B",
            "C",
            "N",
            "O",
            "F",
            "Ne",
            "Na",
            "Mg",
            "Al",
            "Si",
            "P",
            "S",
            "Cl",
            "Ar",
            "K",
            "Ca",
            "Sc",
            "Ti",
            "V",
            "Cr",
            "Mn",
            "Fe",
            "Co",
            "Ni",
            "Cu",
            "Zi",
            "Ga",
            "Ge",
            "As",
            "Se",
            "Br",
            "Kr",
            "Rb",
            "Sr",
            "Y",
            "Zr",
            "Nb",
            "Mo",
            "Tc",
            "Ru",
            "Rh",
            "Pd",
            "Ag",
            "Cd",
            "In",
            "Sn",
            "Sb",
            "Te",
            "In",
            "Xe",
            "Cs",
            "Ba",
            "La",
            "Ce",
            "Pr",
            "Nd",
            "Pm",
            "Sm",
            "Eu",
            "Gd",
            "Tb",
            "Dy",
            "Ho",
            "Er",
            "Tm",
            "Yb",
            "Lu",
            "Hf",
            "Ta",
            "W",
            "Re",
            "Os",
            "Ir",
            "Pt",
            "Au",
            "Hg",
            "Tl",
            "Pb",
            "Bi",
            "Po",
            "At",
            "Rn",
            "Fr",
            "Ra",
            "Ac",
            "Th",
            "Pa",
            "U",
            "Np",
            "Pu",
            "Am",
            "Cm",
            "Bk",
            "Cf",
            "Es",
            "Fm",
            "Md",
            "No",
            "Lr",
            "Rf",
            "Db",
            "Sg",
            "Bh",
            "Hs",
            "Mt",
            "Ds",
            "Rg",
            "Cn",
            "Nh",
            "Fl",
            "Mc",
            "Lv",
            "Ts",
            "Og"
        )

    private val umap =
        mapOf(
            "Uub" to "Cn",
            "Uut" to "Nh",
            "Uuq" to "Fl",
            "Uup" to "Mc",
            "uuh" to "Lv",
            "Uus" to "Ts",
            "Uuo" to "Og",
        )

    override fun encode(src: String): String = src.asIterable().joinToString(" ") { PERIOD_LIST[it.code - 1] }

    override fun decode(src: String): String=
        src.splitBySpace()
            .map { (PERIOD_LIST.indexOf(it.takeIf { it.length <= 2 } ?: umap[it]) + 1).toChar() }
            .joinToString("")

}

val StringEncode.Companion.elementPeriodic:StringEncode<String> get() = ElementPeriodicEncode

val DecodeToString.Companion.elementPeriodic:DecodeToString<String> get() = ElementPeriodicEncode